// Trait 功能测试文件
// 测试 1.1 部分：基础 Trait 定义和实现

// 1.1.1 Trait 声明语法

// 基础 trait 定义
type Display trait {
    func to_string() String
}

// 带多个方法的 trait
type Drawable trait {
    func draw()
    func get_position() Point
    func set_position(p Point)
}

type Nameable trait {
    func get_name() String
}

// 空 trait
type EmptyTrait trait {}

// 1.1.2 Trait 实现（Implementation）

// 定义一个简单的 Point 结构体
type Point struct {
    x int
    y int
}

// 定义 Person 结构体
type Person struct {
    name String
    age int
}

// 为 Person 实现 Display trait
impl Display for Person {
    func to_string() String {
        return "Person: " + self.name
    }
}

// 为 Person 实现 Nameable trait
impl Nameable for Person {
    func get_name() String {
        return self.name
    }
}

// 为 Point 实现 Drawable trait
impl Drawable for Point {
    func draw() {
        // 绘制点的实现
        println("Drawing point at ", self.x, ", ", self.y)
    }
    
    func get_position() Point {
        return self
    }
    
    func set_position(p Point) {
        self.x = p.x
        self.y = p.y
    }
}


// 主函数测试
func test_trait_suite() {
    var p = Person {
        name: "Alice",
        age: 30
    }
    
    var point = Point {
        x: 10,
        y: 20
    }
    
    // 测试 trait 方法调用
    var str = p.to_string()
    println(str)    
    var name = p.get_name()
    println(name)
    assert(name == "Alice", "Name should be Alice")
    point.draw()
    var pos = point.get_position()
    println(pos)
}
